#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;

/*HJJ QQ479287006
 *给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

 

示例 1：

输入：nums = [-1,2,1,-4], target = 1
输出：2
解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2：

输入：nums = [0,0,0], target = 1
输出：0
 

提示：

3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */


int threeSumClosest(vector<int> &nums, int target) {

    int dis = INT_MAX;


    int ret = 0;

    sort(nums.begin(), nums.end());

    for (int i = 0; i < nums.size(); ++i) {
        int temp = nums[i];
        int low = i + 1;
        int high = nums.size() - 1;

        while (low < high) {
            if (temp + nums[low] + nums[high] > target) {
                if (abs(temp + nums[low] + nums[high] - target) < dis) {
                    dis = abs(temp + nums[low] + nums[high] - target);
                    ret = temp + nums[low] + nums[high];
                }

                high--;
            } else if (temp + nums[low] + nums[high] < target) {

                if (abs(temp + nums[low] + nums[high] - target) < dis) {
                    dis = abs(temp + nums[low] + nums[high] - target);
                    ret = temp + nums[low] + nums[high];
                }

                low++;
            } else
                return temp + nums[low] + nums[high];

        }

    }

    return ret;
}